package cn.wolfcode.shop.service.impl;

import cn.wolfcode.shop.domain.SkuProperty;
import cn.wolfcode.shop.domain.SkuPropertyValue;
import cn.wolfcode.shop.mapper.SkuPropertyMapper;
import cn.wolfcode.shop.service.ISkuPropertyService;
import cn.wolfcode.shop.vo.GenerateSkuVo;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

@Service
public class SkuPropertyServiceImpl implements ISkuPropertyService {

    @Autowired
    private SkuPropertyMapper skuPropertyMapper;

    @Override
    public List<SkuProperty> selectAll() {
        return skuPropertyMapper.selectAll();
    }

    @Override
    public List<SkuProperty> queryByCId(Long catalogId) {
        return skuPropertyMapper.selecyByCId(catalogId);
    }

    @Override
    public void saveOrUpdate(SkuProperty skuProperty) {

        if (skuProperty.getId() == null) {
            skuPropertyMapper.insert(skuProperty);
        } else {
            skuPropertyMapper.updateByPrimaryKey(skuProperty);
        }
    }

    @Override
    public void deleteByPId(Long skuPropertyId) {
        skuPropertyMapper.deleteByPrimaryKey(skuPropertyId);
    }

    @Override
    public SkuProperty get(Long skuPropertyId) {
        return skuPropertyMapper.selectByPrimaryKey(skuPropertyId);
    }

    @Override
    public List<Map> generateSku(GenerateSkuVo generateSkuVo) {

        Map<Long, List<SkuPropertyValue>> map = new HashMap<Long, List<SkuPropertyValue>>();

        List<SkuPropertyValue> tempList;
        //generateSkuVo获取前台传过来的数据
        for (SkuPropertyValue spv : generateSkuVo.getSkuPropertyValueList()) {
            //获取id,数组里添加值
            tempList = map.get(spv.getSkuPropertyId());
            //如果该id不存在
            if (tempList == null) {
                //把id相对应的值存进map
                tempList = new ArrayList<SkuPropertyValue>();

                map.put(spv.getSkuPropertyId(), tempList);
            }
            tempList.add(spv);
        }

        //sourceList: 7:白色,7:黑色,7:金色
        ArrayList<List<SkuPropertyValue>> sourceList = new ArrayList<List<SkuPropertyValue>>(map.values());
        ArrayList<List<SkuPropertyValue>> targetList = new ArrayList<List<SkuPropertyValue>>();
        generateSku(sourceList, targetList, 0, Collections.EMPTY_LIST);

        List<Map> skuList = new ArrayList<Map>();
        //根据id获取前缀生成sku编码
        String skuCodePreFix = skuPropertyMapper.getSkuCodePreFix(generateSkuVo.getProduct().getCatalog().getId());
        for (int j = 0; j < targetList.size(); j++) {
            List<SkuPropertyValue> skuTempList = targetList.get(j);
            HashMap<String, String> skuMap = new HashMap();
            if (j > 8) {
                skuMap.put("code", skuCodePreFix + generateSkuVo.getProduct().getId() + (j + 1));
            } else {
                skuMap.put("code", skuCodePreFix + generateSkuVo.getProduct().getId() + "0" +
                        "" + (j + 1));
            }

            skuMap.put("price", generateSkuVo.getProduct().getBasePrice() + "");
            for (int i = 0; i < skuTempList.size(); i++) {
                skuMap.put(skuTempList.get(i).getSkuPropertyId() + "", skuTempList.get(i).getValue());
            }

            skuList.add(skuMap);

        }
        return skuList;
    }


    private static void generateSku(List<List<SkuPropertyValue>> sourceList, List<List<SkuPropertyValue>> targetList,
                                    int level, List<SkuPropertyValue> tempList) {
        //判断是否最后一层
        if (level < sourceList.size() - 1) {
            //不是最后一层
            List<SkuPropertyValue> skuPropertyValues = sourceList.get(level);
            for (SkuPropertyValue skuPropertyValue : skuPropertyValues) {
                ArrayList newTempList = new ArrayList(tempList);
                newTempList.add(skuPropertyValue);
                generateSku(sourceList, targetList, level + 1, newTempList);
            }
        } else {
            //最后一层
            List<SkuPropertyValue> skuPropertyValues = sourceList.get(level);
            for (SkuPropertyValue skuPropertyValue : skuPropertyValues) {
                List newTempList = new ArrayList(tempList);
                newTempList.add(skuPropertyValue);
                targetList.add(newTempList);
            }
        }
    }
}
